package com.liusy.taskengine;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import org.apache.log4j.Logger;

import com.liusy.common.ClassHelp;
import com.liusy.taskengine.listeners.IReleaseTaskListener;
import com.liusy.taskengine.resultmodel.IResultModel;
import com.liusy.taskengine.taskmodel.ITaskModel;


/**
 * 发布任务器（发布List任务）任务大小、执行器个数、执行频率，需要调节到合适数据。
 * 
 * 
 * @author liusy 2012-12-13
 */
public class JobListTask {
	
	private static Logger log = Logger.getLogger(JobListTask.class);
	
	//管理者(管理执行器)
	private TaskManager taskManager = null;
	
	//任务发布器
	private ReleaseTask rt = null;
	
	
	private Vector<Map<String,Object>> listMap = new Vector<Map<String,Object>>();
	
	//任务处理者
	protected String sqlExecuteModelClassStr = "";
	
	
	//任务模型
	protected String sqlTaskModelClassStr = "";

	
	public JobListTask(List<Map<String,Object>> listMap,String sqlTaskModelClassStr,IResultModel rm){
		this.listMap.addAll(listMap);
		this.sqlTaskModelClassStr = sqlTaskModelClassStr;
		//初始化任务引擎
		InitialTaskEngine.initTaskEngine();
		//执行器管理
		this.taskManager= new TaskManager(TaskEngineConstant.ON,rm); 
		//发布任务
		this.rt = new ReleaseTask(taskManager);
		rt.start();
		log.info(" -----------------------------开始--------------------------");
	}
	
	
	/**
	 * 添加一个任务
	 * 
	 * @return
	 */
	public void addListTask(Map<String,Object> map){
		listMap.add(map);
	}
	
	/**
	 * 添加一个任务集合
	 * 
	 * @return
	 */
	public void addListTasks(List<Map<String,Object>> listMap){
		listMap.addAll(listMap);
	}
	
	
	/**
	 * 得到正在等待排队中的任务的个数
	 * 
	 * @return
	 */
	public int getListTaskCount(){
		return listMap.size();
	}
	
	/**
	 * 添加监听任务执行状态
	 * 
	 * @param listenerType
	 * @param lisener
	 */
	public void AddReleaseTaskListener(String listenerType,IReleaseTaskListener lisener)
	{
		this.rt.addListener(listenerType, lisener);
	}
	
	
	/**
	 * 发布任务 
	 * 
	 */
	private void AddReleaseTask(ITaskModel taskModel){
		
			rt.ExeReleaseTask(taskModel);
		
	}
	
	
	@SuppressWarnings("unchecked")
	public ITaskModel getTaskModel(Object o) {
		
		Map<String,Object> map = (Map<String, Object>) o ;
		return (ITaskModel)ClassHelp.newObjectInstance(sqlTaskModelClassStr,new Class []{Map.class}, map);
	}
	
	
	public void StartReleaseTask() {
		
		while (listMap.size() != 0) {
			
			Map task = listMap.firstElement();
			listMap.remove(task);
			// 任务模型
			//ITaskModel taskModel = new SqlTaskModel(task);
			// 执行者模型
			//IExecuteModel executeModel = new SqlExecuteModel();
			
			AddReleaseTask(getTaskModel(task));

		}
		//开始执行缓存中的任务
		rt.StartCacheTaskStartExecute();
	}
	

}
